/**
 * <b>项目名：</b>zlhy-coll-web<br/>  
 * <b>包名：</b>cn.org.cflac.wdh.excel<br/>  
 * <b>文件名：</b>ExportExcelUtil.java<br/>  
 * <b>版本信息：</b>1.0<br/>  
 * <b>日期：</b>2016年9月19日 下午7:16:53<br/>  
 * <b>COPYRIGHT 2010-2012 ALL RIGHTS RESERVED 中国软件与技术服务股份有限公司</b>-版权所有<br/>
 */
package com.flea.hclv.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.http.HttpServletResponse;
import java.io.*;

/**
 * @description
 * @createTime 2016年9月19日 下午7:16:53
 * @modifyTime 
 * @author 1009431383@qq.com
 * @version 1.0
 */

public class ExportExcelUtil {

    private static Logger logger = Logger.getLogger(ExportExcelUtil.class);
 /*   *//**
     * 
     * @description 以流的方式导出excel
     * @methodName createExcel
     * @param
     *          fileName：导出excel的名称
     *          tableTitle：导出excel的表头
     *          tableList  ：导出excel的表体  List<Map<String, Object>>和JsonArray均可
     * @returnType void   
     * @throw
     *//*
    public void createExcel(HttpServletResponse response, String fileName, String[] tableTitle, String[] tableListField, JSONArray tableList,String deptName) {
        OutputStream os = null;
        logger.debug("--执行ExportExcelUtil中的createExcel方法 开始--");
        try {
            if(fileName.indexOf(".xls")==-1) {
                fileName = fileName + ".xls";
            }
            // ===定义输出流，以便打开保存对话框 开始 ===
            os = response.getOutputStream();// 取得输出流
            response.reset();// 清空输出流
            response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
            // 设定输出文件头
            response.setContentType("application/msexcel");// 定义输出类型
            // ===定义输出流，以便打开保存对话框 结束===

            // 创建excel表
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet(fileName);
            sheet.setDefaultColumnWidth(15);

            // ===设置excel表格样式1 开始 ===
            HSSFCellStyle style1 = workbook.createCellStyle();
            // 设置excel表格边框
            style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置excel显示位置：横向居中
            style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 设置excel显示位置：纵向居中
            style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 设置excel字体样式
            HSSFFont font = workbook.createFont();
            // font.setColor(HSSFColor.VIOLET.index);
            // font.setFontHeightInPoints((short)12);
            // 设置excel字体样式：加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            style1.setFont(font);
            // ===设置excel表格样式1 结束 ===
            
            // ===设置excel表格样式2 开始 ===  
            HSSFCellStyle style2 = workbook.createCellStyle();
            // 设置excel表格边框
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置excel显示位置：横向居左
            style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
            // 设置excel单元格自动换行
            style2.setWrapText(true);
            HSSFFont font2 = workbook.createFont();
            // 设置excel字体样式：普通
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            style2.setFont(font2);
            // ===设置excel表格样式2 结束 ===  
            
            // 设置excel标题
            HSSFRow row1, row2;
            //这是excel表头
            HSSFRow row0 = sheet.createRow(0);
         HSSFCell cell0 =    row0.createCell(0);
         cell0.setCellStyle(style1);
         cell0.setCellValue(new HSSFRichTextString("中国文联第十次全国代表大会代表团名册登记表"));
         CellRangeAddress range = new CellRangeAddress(0, 0, 0, 8);   
         sheet.addMergedRegion(range);   
      //设置xx代表机构所在的位置
         
         HSSFRow row01 = sheet.createRow(1);
         HSSFCell cell01 = row01.createCell(7);
         cell01.setCellStyle(style2);
         cell01.setCellValue(new HSSFRichTextString(deptName));
         CellRangeAddress range2 = new CellRangeAddress(1, 1, 7,8);   
         sheet.addMergedRegion(range2);
            HSSFCell cell1, cell2;
            row1 = sheet.createRow(2);
            for (int i = 0; i < tableTitle.length; i++) {
                cell1 = row1.createCell(i);
                cell1.setCellStyle(style1);
                cell1.setCellValue(tableTitle[i]);
            }

            // 设置excel表体
            JSONObject jsonObject = null;
            for (int r = 0, rLen = tableList.size(); r < rLen; r++) {
                row2 = sheet.createRow(r +3);
                jsonObject = tableList.getJSONObject(r);
                // String[] key = jsonObject.keySet().toArray(new String[0]);
                
                for (int c = 0, cLen = tableListField.length; c < cLen; c++) {
                    cell2 = row2.createCell(c);
                    cell2.setCellStyle(style2);
                    cell2.setCellValue(jsonObject.getString(tableListField[c]));
                }
            }
            // 将excel以流的方式输出
            workbook.write(os);
            workbook.close();
            response.setContentType("text/html; charset=UTF-8"); //转码
            PrintWriter out = response.getWriter();
            out.flush();
            out.println("<script>");
            out.println("alert('导出成功！');");
            out.println("</script>");
            logger.debug("--执行ExportExcelUtil中的createExcel方法 结束--");
        } catch (Exception e) {
            logger.debug("--执行ExportExcelUtil中的createExcel方法 出错--");
            e.printStackTrace();
        }  finally {
            try {
                if (os != null) {
                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
    
    public void createExcel(HttpServletResponse response, String fileName, String[] tableTitle, String[] tableListField, List<Map<String, Object>> tableList,String deptName) {
        String json = JSONObject.toJSONString(tableList);
        createExcel(response, fileName, tableTitle, tableListField, JSONObject.parseArray(json),deptName);
    }
    *//**
     *为了实现导出写入本地，并不是下载
     * @description
     * @methodName createExcel
     * @param
     * @returnType void   
     * @throw
     */
    public static void createExcel(HttpServletResponse response,String path, String fileName,String title, String[] tableListField, JSONArray tableList) {
        File file1 = null;
//        String json = JSONObject.toJSONString(tableList);
        FileOutputStream os = null;
        logger.debug("--执行ExportExcelUtil中的createExcel方法 开始--");
        try {
            if(!fileName.contains(".xls")) {
                fileName = fileName + ".xls";
            }
            // ===定义输出流，以便打开保存对话框 开始 ===
            //未见名命名规则应该是部门的名称才对
            File file = new File(path);
                if(!file .exists()  && file .isDirectory())   {
                file.mkdirs();
            }
             file1 = new File(path+"\\"+fileName);
            if(file1.exists())
            {
                file1.delete();

            }
                file1.createNewFile();

            os = new FileOutputStream(file1);// 取得输出流
          //  response.reset();// 清空输出流
         //   response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO-8859-1"));
            // 设定输出文件头
          //  response.setContentType("application/msexcel");// 定义输出类型
            // ===定义输出流，以便打开保存对话框 结束===

            // 创建excel表
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet(fileName);
            sheet.setDefaultColumnWidth(15);

            // ===设置excel表格样式1 开始 ===
            HSSFCellStyle style1 = workbook.createCellStyle();
            // 设置excel表格边框
            style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置excel显示位置：横向居中
            style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            // 设置excel显示位置：纵向居中
            style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            // 设置excel字体样式
            HSSFFont font = workbook.createFont();
             font.setColor(HSSFColor.VIOLET.index);
             font.setFontHeightInPoints((short)12);
            // 设置excel字体样式：加粗
            font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            style1.setFont(font);
            // ===设置excel表格样式1 结束 ===

            // ===设置excel表格样式2 开始 ===
            HSSFCellStyle style2 = workbook.createCellStyle();
            // 设置excel表格边框
            style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
            // 设置excel显示位置：横向居左
            style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
            // 设置excel单元格自动换行
            style2.setWrapText(true);
            HSSFFont font2 = workbook.createFont();
            // 设置excel字体样式：普通
            font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
            style2.setFont(font2);
            // ===设置excel表格样式2 结束 ===

            // 设置excel标题
            HSSFRow row1, row2;
            //这是excel表头
            HSSFRow row0 = sheet.createRow(0);
         HSSFCell cell0 =    row0.createCell(0);
         cell0.setCellStyle(style1);
         cell0.setCellValue(new HSSFRichTextString(title));
         CellRangeAddress range = new CellRangeAddress(0, 0, 0, 7);
         sheet.addMergedRegion(range);
      //设置xx代表机构所在的位置

//         HSSFRow row01 = sheet.createRow(1);
//         HSSFCell cell01 = row01.createCell(7);
//         cell01.setCellStyle(style2);
//         cell01.setCellValue(new HSSFRichTextString(deptName));
//         CellRangeAddress range2 = new CellRangeAddress(1, 1, 7,8);
//         sheet.addMergedRegion(range2);
            HSSFCell cell1, cell2;
            row1 = sheet.createRow(1);
            for (int i = 0; i < tableListField.length; i++) {
                cell1 = row1.createCell(i);
                cell1.setCellStyle(style1);
                cell1.setCellValue(tableListField[i]);
            }

            // 设置excel表体
            JSONObject jsonObject = null;
            for (int r = 0, rLen = tableList.size(); r < rLen; r++) {
                row2 = sheet.createRow(r +2);
                jsonObject = tableList.getJSONObject(r);
                // String[] key = jsonObject.keySet().toArray(new String[0]);

                for (int c = 0, cLen = tableListField.length; c < cLen; c++) {
                    cell2 = row2.createCell(c);
                    cell2.setCellStyle(style2);
                    cell2.setCellValue(jsonObject.getString(tableListField[c]));
                }
            }
            // 将excel以流的方式输出
            workbook.write(os);
            workbook.close();
            response.setContentType("text/html; charset=UTF-8"); //转码
            logger.debug("--执行ExportExcelUtil中的createExcel方法 结束--");
        } catch (Exception e) {
            logger.debug("--执行ExportExcelUtil中的createExcel方法 出错--");
            e.printStackTrace();
        }  finally {

            try {
                if (os != null) {
                    os.close();

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static String getUTF8String(String str) throws UnsupportedEncodingException {
        return new String(str.getBytes("ISO-8859-1"), "UTF-8");
    }
}

